package com.lurenjia.pets_adoption.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.lurenjia.pets_adoption.dto.AdoptionDTO;
import com.lurenjia.pets_adoption.dto.R;
import com.lurenjia.pets_adoption.entity.Pets;
import com.lurenjia.pets_adoption.entity.Users;
import com.lurenjia.pets_adoption.service.IPetsService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.time.LocalDate;

/**
 * 宠物仓库系统前端控制器
 * <p>
 * 提供宠物信息管理相关功能，包括宠物信息的增删改查、宠物领养申请等操作。
 * 支持管理员对宠物信息进行维护，以及用户对宠物进行领养申请。
 *
 * @module 宠物仓库系统
 */
@RestController
@RequestMapping("/pets")
@Slf4j
public class PetsController {
    @Autowired
    private IPetsService petsService;

    /**
     * 分页查询宠物数据
     * <p>
     * 根据分页参数和查询条件获取宠物列表，支持按宠物信息进行筛选。
     * 根据用户类型返回不同的数据展示范围。
     *
     * @param page     查询页码
     * @param pageSize 页码大小
     * @param pets     查询条件对象，包含宠物的筛选条件，可能为空
     * @param session  用户会话信息，用于获取当前用户类型
     * @return 分页的宠物列表响应
     */
    @GetMapping("/page")
    public R<Page> page(Integer page, Integer pageSize, Pets pets,HttpSession session) {
        log.info("收到获取宠物列表的请求：{}", pets);
        //获取用户类型
        Integer userType = ((Users) session.getAttribute("user")).getUserType()==1?1:0;
        //获取数据
        R<Page> resp = petsService.getList(page,pageSize,pets,userType);
        return resp;
    }

    /**
     * 新增一个宠物
     * <p>
     * 添加新的宠物信息到系统中，设置宠物的入库时间和初始状态。
     *
     * @param pet     宠物信息对象，包含宠物的基本信息
     * @param session 用户会话信息
     * @return 操作结果响应
     */
    @CacheEvict(value = "pet",allEntries = true)
    @PostMapping("/save")
    public R<String> save(@RequestBody Pets pet, HttpSession session) {
        log.info("新增宠物信息：{}", pet);
        //补充初始数据
        pet.setPetIndata(LocalDate.now());
        pet.setPetStatus(0);

        //新增宠物信息 到数据库
        petsService.save(pet);
        return R.success("新增成功");
    }

    /**
     * 修改宠物信息
     * <p>
     * 更新现有宠物的信息，可以修改宠物的基本属性。
     *
     * @param pet 宠物信息对象，包含需要更新的宠物信息
     * @return 操作结果响应
     */
    @CacheEvict(value = "pet",allEntries = true)
    @PostMapping("/update")
    public R<String> update(@RequestBody Pets pet) {
        log.info("修改宠物信息：{}", pet);
        R<String> resp = petsService.updateField(pet);
        return resp;
    }

    /**
     * 删除一个宠物
     * <p>
     * 根据宠物ID从系统中删除指定的宠物信息。
     *
     * @param pet     包含宠物ID的宠物对象
     * @param session 用户会话信息
     * @return 操作结果响应
     */
    @CacheEvict(value = "pet",allEntries = true)
    @DeleteMapping
    public R<String> remove(@RequestBody Pets pet, HttpSession session) {
        log.info("删除宠物的请求，id为：{}", pet.getPetId());

        LambdaQueryWrapper<Pets> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Pets::getPetId, pet.getPetId());

        petsService.remove(queryWrapper);
        return R.success("删除成功");
    }

    /**
     * 申请领养宠物
     * <p>
     * 用户提交宠物领养申请，指定希望领养的宠物和预约时间。
     *
     * @param adoptionDTO 领养申请信息，包含宠物ID和预约时间（格式为：yyyy/MM/dd）
     * @param session     用户会话信息，用于获取申请人信息
     * @return 操作结果响应
     */
    @CacheEvict(value = {"adoption","pet"},allEntries = true)
    @PostMapping("/adoption")
    public R<String> adoption(@RequestBody AdoptionDTO adoptionDTO, HttpSession session) {
        log.info("被申领宠物id {} ",adoptionDTO.getPetId());
        R<String> resp = petsService.adoptionUp(adoptionDTO,session);
        return resp;
    }
}